﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ViewRidgeAssistant
{
    public partial class form_customer : Form
    {
        private main _parent;                                   //Указатель на главное окно
        private data_source _data_module;                       //Указатель на интерфейс к базе
        private string _state;                                  //Состояние (new/old/mod)
        private string _id;

        /// <summary>
        /// Конструктор, вызываемый при нажатии "Добавить" на форме main с активным списком клиентов
        /// </summary>
        /// <param name="parent">Указатель на главное окно для разблокировки</param>
        /// <param name="data_module">Указатель на интерфейс к базе данных</param>
        public form_customer(main parent, data_source data_module)
        {
            InitializeComponent();
            this._parent = parent;
            this._data_module = data_module;
            this.set_state("NEW");               //Форма в режиме ввода нового клиента  
        }

        //Конструктор, вызываемый при построении формы для редактирования существующей картины
        public form_customer(main parent, data_source data_module, int act_id)
        {
            InitializeComponent();
            this._id = act_id.ToString();
            this._parent = parent;
            this._data_module = data_module;
            this.fill_customer_data();
            this.update_interests();
            this.set_state("OLD");          //Форма находится в режиме просмотра сущ. записи
        }

        public void set_state(string state)
        {
            switch (state)
            {
                case "OLD":
                this._state = "OLD";
                this.Text = "Клиент - Просмотр";
                this.l_status.Text = "";
                this.b_save.Enabled = false;
                this.b_delete.Enabled = true;
                this.g_interests.Enabled = true;
                this.b_print_card.Enabled = true;
                //this.g_actions.Enabled = true;
                break;

                case "NEW":
                this._state = "NEW";
                this.Text = "Клиент - Добавление";
                this.b_save.Enabled = false;
                this.b_delete.Enabled = false;
                //this.g_actions.Enabled = false;
                this.g_interests.Enabled = false;
                this.b_print_card.Enabled = false;
                break;

                case "MOD":
                this._state = "MOD";
                this.Text = "Клиент - Редактирование";
                this.b_save.Enabled = true;
                this.b_print_card.Enabled = false;

                break;
            }
        }

        public void fill_customer_data()
        {
            class_customer customer;
            customer = this._data_module.get_customer(Convert.ToInt32(this._id));
            if (customer.result == "OK")
            {
                this.tb_name.Text = customer.name;
                this.tb_area_code.Text = customer.area_code;
                this.tb_lnumber.Text = customer.local_number;
                this.tb_street.Text = customer.street;
                this.tb_city.Text = customer.city;
                this.tb_state.Text = customer.state;
                this.tb_zpcode.Text = customer.zip_postal_code;
                this.tb_country.Text = customer.country;
                this.tb_email.Text = customer.email;
                this.tb_phone.Text = customer.phone_number;

            }
            else
            {
                //Не удалось получить сведений о текущем клиенте
                MessageBox.Show(customer.result);
                this._parent.Enabled = true;
                this.Dispose();
            }
        }

        /// <summary>
        /// Конструктор, вызываемый при нажатии "Редактировать" на форме main с активным списком клиентов
        /// </summary>
        public form_customer()
        {

        }

        private void form_customer_closed(object sender, FormClosedEventArgs e)
        {  
            //_parent.Enabled = true;
            this.Dispose();
        }

        private void b_save_Click(object sender, EventArgs e)
        {
            if ((this.tb_name.Text == "") || (this.tb_phone.Text == ""))
            {
                MessageBox.Show("Не заполнены обязательные поля!");
                return;
            }
                                        //Делать на этом уровне проверку вводимых данных или нет?
            string result;              //Результат попытки сохранения/добавления клиента
            switch (this._state) 
            {   
                //Если добавляется новая запись...
                case "NEW":
                    this.l_status.Text = "Добавление нового клиента...";
                    result = this._data_module.add_customer(this.tb_name.Text, this.tb_area_code.Text, this.tb_lnumber.Text,
                                                this.tb_street.Text, this.tb_city.Text, this.tb_state.Text,
                                                this.tb_zpcode.Text, this.tb_country.Text, this.tb_email.Text, this.tb_phone.Text);
                       
                break;

                //Если модифицируется существующая...
                case "MOD":
                    this.l_status.Text = "Модификация данных о клиенте.. ";
                    result = this._data_module.upd_customer(Convert.ToInt32(this._id), this.tb_name.Text, this.tb_area_code.Text, this.tb_lnumber.Text,
                                                 this.tb_street.Text, this.tb_city.Text, this.tb_state.Text,
                                                 this.tb_zpcode.Text, this.tb_country.Text, this.tb_email.Text, this.tb_phone.Text);
               
               break;

               default:
                    this.l_status.Text = "Ошибка";
                    result = "NDF"; // не используется, однако mvs не позволяет 
                    // дальше работать переменной, которой в одной
                    // из веток кода не присваивается значение :(
               break;
            }

         if (result == "OK")
            {
                //well, it's work...
                this._parent.UpdateActiveGW();
                if (this._state == "NEW")
                {
                    //this.l_status.Text = "Запись успешно добавлена, получеие ID...";
                    //this._id = this._data_module.get_customer_id_by_info(this.tb_name.Text, this.tb_area_code.Text, this.tb_phone.Text,
                    //                        this.tb_street.Text, this.tb_city.Text, this.tb_state.Text,
                    //                        this.tb_zpcode.Text, this.tb_country.Text, this.tb_email.Text, this.tb_phone.Text);
                    this.set_state("OLD");
                    this._parent.Enabled = true;
                    this.Dispose();
                    //this.l_status.Text = "Добавлеие успешно завершено";
                }
                else 
                if (this._state == "MOD")
                {
                    this.set_state("OLD");
                    this.l_status.Text = "Изменение записи успешно завершено";
                }
            }
            else
            {
                this.l_status.Text = "Ошибка";
                MessageBox.Show(result);
            }

        }

        private void enabled_b_save(object sender, EventArgs e)
        {
            //this.b_delete.Enabled = false;
            this.l_status.Text = "Запись изменена";
            this.b_save.Enabled = true;
            if (this._state == "OLD") { this.set_state("MOD"); };
        }

        private void b_delete_Click(object sender, EventArgs e)
        {
            this.l_status.Text = "Удаление записи...";
            string result = this._data_module.del_record_by_id("CUSTOMER", Convert.ToInt32(this._id));
            if (result == "OK")
            {
                this.l_status.Text = "Запись успешно удалена";
                this._parent.Enabled = true;
                this.Dispose();
            }
            else
            {
                this.l_status.Text = "Ошибка";
                MessageBox.Show(result);
            }
        }

        private void b_mail_Click(object sender, EventArgs e)
        {

        }

        private void b_create_trans_Click(object sender, EventArgs e)
        {

        }

        private void b_del_interest_Click(object sender, EventArgs e)
        {

        }

        public void update_interests()
        {
            ArrayList interests;
            interests = this._data_module.get_interests_list(Convert.ToInt32(this._id));
            this.lb_interests.Items.Clear();
            foreach (string interes in interests)
            {
                this.lb_interests.Items.Add(interes);
            }

            interests.Clear();
        }

        private void b_change_interest_Click(object sender, EventArgs e)
        {
            form_search interests = new form_search(this, this._data_module, Convert.ToInt32(this._id));
            //this.Enabled = false;
            interests.ShowDialog();
        }

        private void b_print_card_Click(object sender, EventArgs e)
        {
            ReportGenerator rep_gen = new ReportGenerator(this._data_module, "CUSTOMER_INFO", Convert.ToInt32(this._id));
        }
            
    }
}
